/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica;

import Proxy.WsBebe.Bebe;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Properties;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

/**
 *Clase que realiza las operaciones sobre el xmlque posee los datos de los bebe
 * @author familia
 */
public class BebeXml {
    
    private Properties prop = new Properties();
    
    private String ruta;
    
    /**
     * Constructor de la clase que inicializa el archivo properties para
     * leer la ruta del xml que contiene la informacion de bebe
     */
    public BebeXml(){
        InputStream is = null;

        try {
          is=new FileInputStream("Configuracion.properties");
          prop.load(is);
          ruta = prop.getProperty("rutaXmlBebe");
        } catch(IOException ioe) {}
    }
    /**
     * Metodo que almacena los datos de un bebe en el xml
     * @param bebe datos a almacenar
     * @return true si se realiza la insercion false si no
     */
    public int AgregarBebe(Bebe bebe){
        
        int retorno = -1;
        try {
            boolean vacio = false;
            if(!ExisteBebe(bebe)){
                
            SAXBuilder builder = new SAXBuilder();
            SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
            File archivo = new File(ruta);
                Document result;
                Element raiz;
                if(!archivo.exists()){
                    result = new Document(); 
                    archivo.createNewFile();
                    raiz = new Element("bebes");
                    vacio = true;
                }else{
                    
                    result = builder.build(new FileInputStream(archivo));  
                    raiz = result.getRootElement();
                }
                
            retorno = Integer.parseInt(bebe.getId());
            Element nodo = new Element("bebe");
            nodo.addContent(new Element("apellido").setText(bebe.getApellido().toString()));
            nodo.addContent(new Element("nombre").setText(String.valueOf(bebe.getNombre())));
            nodo.addContent(new Element("cedulaPapa").setText(String.valueOf(bebe.getCedulaPapa())));
            nodo.addContent(new Element("idbebe").setText(String.valueOf(bebe.getId())));            
            nodo.addContent(new Element("fechaNacimiento").setText(bebe.getFechaNacimiento().getDay() + "/" + 
                      bebe.getFechaNacimiento().getMonth() + "/" + 
                      bebe.getFechaNacimiento().getYear()));
            
            raiz.addContent(nodo);
            
                if(vacio)
                    result.addContent(raiz);
            XMLOutputter xml_out=new XMLOutputter();
            FileOutputStream file_os=new FileOutputStream(ruta);
            xml_out.output(result,file_os);
            
            file_os.close();
            
            }
            retorno = Integer.parseInt(bebe.getId());
        } catch (Exception e) {
        }
        return retorno;
    }
    
    /**
     * Metodo que verifica que exista registrado un bebe localmente
     * @return lista de bebe
     */
    public boolean ExisteBebe(Bebe consulta){
        Document result;
        boolean retorno = false;
        try {
            GregorianCalendar gcal = new GregorianCalendar();
            XMLGregorianCalendar fec;
            fec = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
            SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
            SAXBuilder builder = new SAXBuilder();
            result = builder.build(new FileInputStream(ruta));  
            Element raiz = result.getRootElement(); 
            List<Element> hijosRaiz = raiz.getChildren("bebe"); 
            for (Element elemento : hijosRaiz) {
                gcal = new GregorianCalendar();
                Bebe nuevo = new Bebe();
                nuevo.setId(elemento.getChild("idbebe").getValue());
                nuevo.setApellido(elemento.getChild("apellido").getValue());
                nuevo.setCedulaPapa(elemento.getChild("cedulaPapa").getValue());
                nuevo.setNombre(elemento.getChild("nombre").getValue());
                String[] fec_part = elemento.getChild("fechaNacimiento").getValue().split("/");
                fec.setYear(Integer.parseInt(fec_part[2]));
                fec.setMonth(Integer.parseInt(fec_part[1]));
                fec.setDay(Integer.parseInt(fec_part[0]));
                nuevo.setFechaNacimiento(fec);
                if(nuevo.getNombre().equalsIgnoreCase(consulta.getNombre()) && nuevo.getApellido().
                        equalsIgnoreCase(consulta.getApellido()) && nuevo.getCedulaPapa().
                        equalsIgnoreCase(consulta.getCedulaPapa()) && 
                        nuevo.getFechaNacimiento().compare(consulta.getFechaNacimiento())== 0){
                    retorno = true;
                }
            }

        } catch (Exception e) {  
            System.out.println(e.getMessage());
            retorno = false;
        }
        return retorno;
    }
    
    /**
     * Metodo que obtiene todos los bebes que se ecuentran almacenados
     * @return lista de bebe
     */
    public List<Bebe> ObtenerBebes(Bebe consulta){
        List<Bebe> retorno = new ArrayList<Bebe>();
        Document result;
        try {
            GregorianCalendar gcal = new GregorianCalendar();
            XMLGregorianCalendar fec;
            fec = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
            SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
            SAXBuilder builder = new SAXBuilder();
            result = builder.build(new FileInputStream(ruta));  
            Element raiz = result.getRootElement(); 
            List<Element> hijosRaiz = raiz.getChildren("bebe"); 
            for (Element elemento : hijosRaiz) {
                gcal = new GregorianCalendar();
                Bebe nuevo = new Bebe();
                nuevo.setId(elemento.getChild("idbebe").getValue());
                nuevo.setApellido(elemento.getChild("apellido").getValue());
                nuevo.setCedulaPapa(elemento.getChild("cedulaPapa").getValue());
                nuevo.setNombre(elemento.getChild("nombre").getValue());
                String[] fec_part = elemento.getChild("fechaNacimiento").getValue().split("/");
                fec.setYear(Integer.parseInt(fec_part[2]));
                fec.setMonth(Integer.parseInt(fec_part[1]));
                fec.setDay(Integer.parseInt(fec_part[0]));
                boolean agregado = false;
                nuevo.setFechaNacimiento(fec);
                if(consulta == null)
                    retorno.add(nuevo);
                else if((!"".equals(consulta.getNombre()))&& nuevo.getNombre().
                        equalsIgnoreCase(consulta.getNombre()) && !agregado){
                    retorno.add(nuevo);
                    agregado = true;
                }
                else if((!"".equals(consulta.getApellido()))&& nuevo.getApellido().
                        equalsIgnoreCase(consulta.getApellido()) && !agregado){
                    retorno.add(nuevo);
                    agregado = true;
                }
                else if((!"".equals(consulta.getCedulaPapa()))&& nuevo.getCedulaPapa().
                        equalsIgnoreCase(consulta.getCedulaPapa()) && !agregado){
                    retorno.add(nuevo);
                    agregado = true;
                }
                if(!agregado)
                    nuevo = null;
                agregado = false;
            }

        } catch (Exception e) {  
            System.out.println(e.getMessage());
        }
        return retorno;
    }
    
    /**
     * Metodo que edita los datos de un bebe en el xml
     * @param bebe datos a almacenar
     * @return true si se realiza la insercion false si no
     */
    public boolean EditarBebe(Bebe bebe){
        
        boolean retorno = false;
        try {
            SAXBuilder builder = new SAXBuilder();
            SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
            Document result = builder.build(new FileInputStream(ruta));  
            Element raiz = result.getRootElement();
            List<Element> hijosRaiz = raiz.getChildren("bebe"); 
            for (Element elemento : hijosRaiz){
                if(elemento.getChild("idbebe").getValue().equalsIgnoreCase(bebe.getId())){
                    elemento.getChild("apellido").setText(bebe.getApellido().toString());
                    elemento.getChild("nombre").setText(String.valueOf(bebe.getNombre()));
                    elemento.getChild("cedulaPapa").setText(String.valueOf(bebe.getCedulaPapa()));
                    elemento.getChild("idbebe").setText(String.valueOf(bebe.getId()));            
                    elemento.getChild("fechaNacimiento").setText(sdf.format(bebe.getFechaNacimiento()));
                }
            }
            
            XMLOutputter xml_out=new XMLOutputter();
            FileOutputStream file_os=new FileOutputStream(ruta);
            xml_out.output(result,file_os);
            
            file_os.close();
            retorno = true;
            
        } catch (Exception e) {
        }
        return retorno;
    }
}
